/*******************************************************************************
 * Copyright (c) 2000, 2003 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials 
 * are made available under the terms of the Common Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/cpl-v10.html
 * 
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
module dwt.events.typedevent;


private import dwt.dwt;


private import dwt.widgets.display;
private import dwt.widgets.event;
private import dwt.widgets.widget;

public import dwt.internal.dwteventobject;



/**
 * This is the super class for all typed event classes provided
 * by DWT. Typed events contain particular information which is
 * applicable to the event occurance.
 *
 * @see org.eclipse.dwt.widgets.Event
 */
public class TypedEvent : DWTEventObject {

	/**
	 * the display where the event occurred
	 * 
	 * @since 2.0 
	 */	
	public Display display;
		
	/**
	 * the widget that issued the event
	 */
	public Widget widget;
	
	/**
	 * the time that the event occurred.
	 * 
	 * NOTE: This field is an unsigned integer and should
	 * be AND'ed with 0xFFFFFFFFL so that it can be treated
	 * as a signed long.
	 */	
	public int time;
	
	/**
	 * a field for application use
	 */
	public Object data;

	
	/**
	 * 
	 * <Shawn> Custom Data, although Eclipse/DWT provide a customized member
	 * "data" above, I am not sure it will be used by DWT in the somewhere else,
	 * so, declare our own. And since D can't cast Object[] to Object, we also
	 * need to declare an Array member
	 * @see EventHandler.cData
	 * @see Event.cData
	 */
	// public Object[] cDatas;
	public Object cData;

/**
 * Constructs a new instance of this class.
 *
 * @param object the object that fired the event
 */
public this(Object object) {
	super(object);
}

/**
 * Constructs a new instance of this class based on the
 * information in the argument.
 *
 * @param e the low level event to initialize the receiver with
 */
public this(Event e) {
	super(e.widget);
	this.display = e.display;
	this.widget = e.widget;
	this.time = e.time;
	this.data = e.data;
	// <Shawn> pass the custom Data to typed Event
	// this.cDatas = e.cDatas;
	this.cData = e.cData;
}

/**
 * Returns the name of the event. This is the name of
 * the class without the package name.
 *
 * @return the name of the event
 */
char[] getName () {
	return (this.classinfo.name.dup);
}

/**
 * Returns a string containing a concise, human-readable
 * description of the receiver.
 *
 * @return a string representation of the event
 */
public char[] toString() {
	
	char[] s = getName ()
		~ "{" ~ widget.toString
		~ " time=" ~ Int.toString( time)
		~ " data="  ~ (data ? data.toString() : "null")
		~ "}";
	return s;
}

}
